package com.hk.core.data.jpa.domain;

import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.hk.commons.util.JsonUtils;
import com.hk.commons.util.StringUtils;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.UuidGenerator;
import org.springframework.data.domain.Persistable;

import java.io.Serializable;

/**
 * <p>
 * 基于 UUID的主键生成
 * </p>
 * <p>
 * JsonFilter : 过滤某一些字段
 * </p>
 *
 * @author kevin
 * @date 2017年12月11日下午8:30:33
 */
@Setter
@Getter
@MappedSuperclass
@JsonFilter(value = JsonUtils.IGNORE_ENTITY_SERIALIZE_FIELD_FILTER_ID)
public abstract class AbstractUUIDPersistable implements Persistable<String>, Serializable {

    /**
     * id 生成策略,strategy 的值可以为 {@link org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory} 中注册的key，也可以为 class 的全类名
     *
     * @see org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory
     */
    @Id
    @UuidGenerator
    @Column(name = "id", updatable = false)
    private String id;

    @Transient // DATAJPA-622
    @JsonIgnore
    @Override
    public final boolean isNew() {
        return StringUtils.isEmpty(getId());
    }

    @Override
    public String toString() {
        return String.format("Entity of type %s with id: %s", this.getClass().getName(), getId());
    }

    @Override
    public boolean equals(Object obj) {
        return super.equals(obj);
    }

    @Override
    public int hashCode() {
        return super.hashCode();
    }

}
